package jp.co.dailyReport;

import java.sql.Date;
import java.sql.Time;
import java.util.Calendar;
import org.apache.log4j.Logger;

/**
 * 全てのクラスで共通する処理をまとめたクラスです。
 */
public class Utilities {

	private static Logger log = Logger.getLogger(Utilities.class);

	/**
	 * java.sql.Date型をjava.util.Calendar型に
	 * 変換して返します。
	 * 
	 * @param date 日付
	 * @return カレンダーオブジェクト
	 */
	public static Calendar getCalendar(Date date) {

		if(date != null) {
			Calendar cal = Calendar.getInstance();
			cal.setTime(date);
			return cal;
		} else {
			return null;
		}
	}

	/**
	 * java.sql.Time型をjava.util.Calendar型に
	 * 変換して返します。
	 * 
	 * @param time 日付
	 * @return カレンダーオブジェクト
	 */
	public static Calendar getCalendar(Time time) {

		if(time != null) {
			Calendar cal = Calendar.getInstance();
			cal.setTime(time);
			return cal;
		} else {
			return null;
		}
	}

	/**
	 * java.util.Calendar型をjava.lang.String型
	 * (yyyy年mm月dd日(曜日))に変換して返します。
	 * 
	 * @param cal 日付
	 * @return 日付の文字列
	 */
	public static String getStrDate(Calendar cal) {

		int year = 0;
		int month = 0;
		int day = 0;
		int dayOfWeek = 0;
		String[] dayOfWeekName={"　","日","月","火","水","木","金","土"};

		String date = null;
		if(cal != null) {
			year = cal.get(Calendar.YEAR);
			month = cal.get(Calendar.MONTH)+1;
			day = cal.get(Calendar.DATE);
			dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
			date = year + "年" + addZero(month) + "月" + addZero(day) + "日" + "(" + dayOfWeekName[dayOfWeek] + ")";
		}
		return date;
	}

	/**
	 * 3つのjava.lang.Integer型の引数を受け取って、
	 * java.util.Calendarインスタンスの年フィールド
	 * 月フィールド、日フィールドにそれぞれ設定して、
	 * さらに曜日フィールドに月曜日データを設定した後、
	 * java.util.Calendarオブジェクトを返します。
	 * 
	 * @param year 年
	 * @param month 月
	 * @param week 曜日
	 * @return カレンダーオブジェクト
	 */
	public static Calendar getSWeekCalendarDate(
	Integer year,
	Integer month,
	Integer week) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year.intValue());
		cal.set(Calendar.MONTH, month.intValue() - 1);
		cal.set(Calendar.WEEK_OF_MONTH, week.intValue());
		cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		return cal;
	}

	/**
	 * 3つのjava.lang.Integer型の引数を受け取って、
	 * java.util.Calendarインスタンスの年フィールド
	 * 月フィールド、日フィールドにそれぞれ設定して、
	 * さらに曜日フィールドに金曜日データを設定した後、
	 * java.util.Calendarオブジェクトを返します。
	 * 
	 * @param year 年
	 * @param month 月
	 * @param week 曜日
	 * @return カレンダーオブジェクト
	 */
	public static Calendar getEWeekCalendarDate(
	Integer year,
	Integer month,
	Integer week) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year.intValue());
		cal.set(Calendar.MONTH, month.intValue() - 1);
		cal.set(Calendar.WEEK_OF_MONTH, week.intValue());
		cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
		return cal;
	}

	/**
	 * 3つのjava.lang.String型の引数を受け取って、
	 * java.util.Calendarインスタンスの年フィールド
	 * 月フィールド、日フィールドにそれぞれ設定して、
	 * java.util.Calendarオブジェクトを返します。
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @return カレンダーオブジェクト
	 */
	public static Calendar getCalendarDate(
		String year,
		String month,
		String day) {
		Calendar cal = Calendar.getInstance();
		cal.set(1, Integer.parseInt(year));
		cal.set(2, Integer.parseInt(month) - 1);
		cal.set(5, Integer.parseInt(day));
		return cal;
	}

	/**
	 * 5つのjava.lang.String型の引数を受け取って、
	 * java.util.Calendarインスタンスの年フィールド
	 * 月フィールド、日フィールド、時フィールド、
	 * 分フィールドにそれぞれ設定して、
	 * java.util.Calendarオブジェクトを返します。
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @param hour 時
	 * @param minute 分
	 * @return カレンダーオブジェクト
	 */
	public static Calendar getCalendarTime(
		String year,
		String month,
		String day,
		String hour,
		String minute) {
		Calendar cal = Calendar.getInstance();
		cal.set(1, Integer.parseInt(year));
		cal.set(2, Integer.parseInt(month) - 1);
		cal.set(5, Integer.parseInt(day));
		cal.set(11, Integer.parseInt(hour));
		cal.set(12, Integer.parseInt(minute));
		return cal;
	}

	/**
	 * 3つのint型の引数を受け取って、
	 * java.util.Calendarインスタンスの年フィールド
	 * 月フィールド、日フィールドにそれぞれ設定して、
	 * java.util.Calendarオブジェクトを返します。
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @return カレンダーオブジェクト
	 */
	public static Calendar getCalendarDate(int year, int month, int day) {
		Calendar cal = Calendar.getInstance();
		cal.set(1, year);
		cal.set(2, month - 1);
		cal.set(5, day);
		return cal;
	}

	/**
	 * 5つのint型の引数を受け取って、
	 * java.util.Calendarインスタンスの年フィールド
	 * 月フィールド、日フィールド、時フィールド、
	 * 分フィールドにそれぞれ設定して、
	 * java.util.Calendarオブジェクトを返します。
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @param hour 時
	 * @param minute 分
	 * @return カレンダーオブジェクト
	 */
	public static Calendar getCalendarTime(
		int year,
		int month,
		int day,
		int hour,
		int minute) {
		Calendar cal = Calendar.getInstance();
		cal.set(1, year);
		cal.set(2, month - 1);
		cal.set(5, day);
		cal.set(11, hour);
		cal.set(12, minute);
		return cal;
	}

	/**
	 * int型をjava.lang.String型で返します。
	 * 0～9の場合、00,01,～,09に変換します。
	 * 
	 * @param number 数値
	 * @return 変換後の文字列
	 */
	public static String addZero(int number) {

		String strNum = null;
		if(number >= 0 && number <= 9) {
			strNum = "0" + number;
		} else {
            strNum = String.valueOf(number);
		}
		return strNum;
	}

	/**
	 * 引数がint型の1の場合、boolean型のtrueを
	 * 引数がint型の1以外の場合、boolean型のfalseを
	 * 返します。
	 * 
	 * @param decimal
	 * @return true→1の場合、false→1以外の場合
	 */
	public static boolean decimalToBoolean(int decimal) {
		return decimal == 1;
	}

	/**
	 * 引数がboolean型のtrueの場合、int型の1を
	 * 引数がboolean型のfalseの場合、int型の0を
	 * 返します。
	 * 
	 * @param value
	 * @return 0→false、1→true
	 */
	public static int booleanToDecimal(boolean value) {
		return value ? 1 : 0;
	}

	/**
	 * 引数の文字列を、メソッド内に定義してある
	 * 文字列に変換して返します。
	 * 
	 * @param str 文字列
	 * @return 変換後の文字列
	 */
	public static String convUniqueCharacter(String str) {

	  if (str==null) return null;
	  char[] c = str.toCharArray();
	  for (int i=0; i<c.length; i++) {
		int n = c[i];
		if (n==12541) { c[i]='㈱'; }
		if (n==12849) { c[i]='ヽ'; } // ㈱12849 --> ヽ 12541
		if (n==12542) { c[i]='㈲'; }
		if (n==12850) { c[i]='ヾ'; } // ㈲12850 --> ヾ 12542
		if (n==12445) { c[i]='－'; }
		if (n==65293) { c[i]='-'; } //－65293
		if (n==8213) { c[i]='-'; } //―8213
		if (n==12446) { c[i]='～'; }
		if (n==65374) { c[i]='ゞ'; }
		if (n==9484) { c[i]='①'; }
		if (n==9312) { c[i]='┌'; }
		if (n==9488) { c[i]='②'; }
		if (n==9313) { c[i]='┐'; }
		if (n==9496) { c[i]='③'; }
		if (n==9314) { c[i]='┘'; }
		if (n==9492) { c[i]='④'; }
		if (n==9315) { c[i]='└'; }
		if (n==9500) { c[i]='⑤'; }
		if (n==9316) { c[i]='├'; }
		if (n==9516) { c[i]='⑥'; }
		if (n==9317) { c[i]='┬'; }
		if (n==9508) { c[i]='⑦'; }
		if (n==9318) { c[i]='┤'; }
		if (n==9524) { c[i]='⑧'; }
		if (n==9319) { c[i]='┴'; }
		if (n==9532) { c[i]='⑨'; }
		if (n==9320) { c[i]='┼'; }
		if (n==9473) { c[i]='⑩'; }
		if (n==9321) { c[i]='━'; }
		if (n==9475) { c[i]='ⅰ'; }
		if (n==8560) { c[i]='┃'; }
		if (n==9487) { c[i]='ⅱ'; }
		if (n==8561) { c[i]='┏'; }
		if (n==9491) { c[i]='ⅲ'; }
		if (n==8562) { c[i]='┓'; }
		if (n==9499) { c[i]='ⅳ'; }
		if (n==8563) { c[i]='┛'; }
		if (n==9495) { c[i]='ⅴ'; }
		if (n==8564) { c[i]='┗'; }
		if (n==9507) { c[i]='ⅵ'; }
		if (n==8565) { c[i]='┣'; }
		if (n==9523) { c[i]='ⅶ'; }
		if (n==8566) { c[i]='┳'; }
		if (n==9515) { c[i]='ⅷ'; }
		if (n==8567) { c[i]='┫'; }
		if (n==9531) { c[i]='ⅸ'; }
		if (n==8568) { c[i]='┻'; }
		if (n==9547) { c[i]='ⅹ'; }
		if (n==8569) { c[i]='╋'; }
		if (n==9504) { c[i]='Ⅰ'; }
		if (n==8544) { c[i]='┠'; }
		if (n==9519) { c[i]='Ⅱ'; }
		if (n==8545) { c[i]='┯'; }
		if (n==9512) { c[i]='Ⅲ'; }
		if (n==8546) { c[i]='┨'; }
		if (n==9527) { c[i]='Ⅳ'; }
		if (n==8547) { c[i]='┷'; }
		if (n==9535) { c[i]='Ⅴ'; }
		if (n==8548) { c[i]='┿'; }
		if (n==9501) { c[i]='Ⅵ'; }
		if (n==8549) { c[i]='┝'; }
		if (n==9520) { c[i]='Ⅶ'; }
		if (n==8550) { c[i]='┰'; }
		if (n==9509) { c[i]='Ⅷ'; }
		if (n==8551) { c[i]='┥'; }
		if (n==9528) { c[i]='Ⅸ'; }
		if (n==8552) { c[i]='┸'; }
		if (n==9538) { c[i]='Ⅹ'; }
		if (n==8553) { c[i]='╂'; }
	  }

	  return new String(c);
	}

	/**
	 * 特殊文字を置き換えます
	 * 例)　"㈱"→"(株)"
	 *
	 * @param str 置き換えたい文字列
	 * @return 置き換え後の文字列
	 */

	public static String changeUniqueCharacter(String str) {
	  if (str==null) return null;
	  char[] c = str.toCharArray();
	  StringBuffer strbf = new StringBuffer();
	  for (int i=0; i<str.length(); i++) {
		char n = c[i];
		if (n=='①') { strbf.append("(1)"); }
		else if (n=='②') { strbf.append("(2)"); }
		else if (n=='③') { strbf.append("(3)"); }
		else if (n=='④') { strbf.append("(4)"); }
		else if (n=='⑤') { strbf.append("(5)"); }
		else if (n=='⑥') { strbf.append("(6)"); }
		else if (n=='⑦') { strbf.append("(7)"); }
		else if (n=='⑧') { strbf.append("(8)"); }
		else if (n=='⑨') { strbf.append("(9)"); }
		else if (n=='⑩') { strbf.append("(10)"); }
		else if (n=='⑪') { strbf.append("(11)"); }
		else if (n=='⑫') { strbf.append("(12)"); }
		else if (n=='⑬') { strbf.append("(13)"); }
		else if (n=='⑭') { strbf.append("(14)"); }
		else if (n=='⑮') { strbf.append("(15)"); }
		else if (n=='⑯') { strbf.append("(16)"); }
		else if (n=='⑰') { strbf.append("(17)"); }
		else if (n=='⑱') { strbf.append("(18)"); }
		else if (n=='⑲') { strbf.append("(19)"); }
		else if (n=='⑳') { strbf.append("(20)"); }
		else if (n=='ⅰ') { strbf.append("i"); }
		else if (n=='ⅱ') { strbf.append("ii"); }
		else if (n=='ⅲ') { strbf.append("iii"); }
		else if (n=='ⅳ') { strbf.append("iv"); }
		else if (n=='ⅴ') { strbf.append("v"); }
		else if (n=='ⅵ') { strbf.append("vi"); }
		else if (n=='ⅶ') { strbf.append("vii"); }
		else if (n=='ⅷ') { strbf.append("viii"); }
		else if (n=='ⅸ') { strbf.append("ix"); }
		else if (n=='ⅹ') { strbf.append("x"); }
		else if (n=='Ⅰ') { strbf.append("I"); }
		else if (n=='Ⅱ') { strbf.append("II"); }
		else if (n=='Ⅲ') { strbf.append("III"); }
		else if (n=='Ⅳ') { strbf.append("IV"); }
		else if (n=='Ⅴ') { strbf.append("V"); }
		else if (n=='Ⅵ') { strbf.append("VI"); }
		else if (n=='Ⅶ') { strbf.append("VII"); }
		else if (n=='Ⅷ') { strbf.append("VIII"); }
		else if (n=='Ⅸ') { strbf.append("IX"); }
		else if (n=='Ⅹ') { strbf.append("X"); }
		else if (n=='㈱') { strbf.append("(株)"); }
		else if (n=='㈲') { strbf.append("(有)"); }
		else if (n=='－') { strbf.append("-"); }
		else if (n=='―') { strbf.append("-"); }
		else if (n=='～') { strbf.append("-"); }
		else{strbf.append(n); }
	  }
	  return strbf.toString();
	}

	/**
	 * 文字列置換を行うメソッド。引数で与えられたtargetに含まれる
	 * from文字列を、to文字列に置換した文字列を返す。
	 *
	 * @param	target 対象
	 * @param	from 置換される文字列
	 * @param	to 置き換わる文字列
	 * @return	置換処理後の文字列
	 */
	public static String replaceString(String target, String from, String to){
	  // exception handling
	  if( target == null || from == null || to == null )
		return target;
	  if( target.length() < 1 || from.length() < 1 || to.length() < 1 )
		return target;

	  StringBuffer results = new StringBuffer(target);
	  int index = 0;
	  boolean isDone = false;
	  while( !isDone ){
		index = target.indexOf( from, index );
		if( index < 0 ){
		  isDone = true;
		} else{
		  target = results.replace(index,index+from.length(), to).toString();
		  index += to.length();
		}
	  }

	  return results.toString();
	}

	/**
	 *　数値かどうかチェックします。
	 *
	 * @param obj オブジェクト
	 * @param type 数値のタイプ（プリミティブの数値型）
	 * @return true→数値である、false→数値でない
	 */
	public static boolean isNumber(Object obj, String type) {
		try {
			if (type.equals("int")) {
				Integer.valueOf(obj.toString());
			} else if (type.equals("long")) {
				Long.valueOf(obj.toString());
			} else if (type.equals("float")) {
				Float.valueOf(obj.toString());
			} else if (type.equals("double")) {
				Double.valueOf(obj.toString());
			} else {
				return false;
			}
			return true;
		} catch (NumberFormatException e) {
			return false;
		}
	}
}
